ã·ã§ãŒããŒãªãœãŒã¹ãã€ã³ãã£ã³ã°ãæé©åããŠWebGLã®ããã©ãŒãã³ã¹ãæå€§éã«åŒãåºããŸããUBOããããåŠçããã¯ã¹ãã£ã¢ãã©ã¹ãã°ããŒãã«ã¢ããªã±ãŒã·ã§ã³åãã®å¹ççãªç¶æ 管çã«ã€ããŠåŠã³ãŸãã
WebGLã·ã§ãŒããŒãªãœãŒã¹ãã€ã³ãã£ã³ã°ã®ç¿åŸïŒæé«ã®ããã©ãŒãã³ã¹æé©åæŠç¥
掻æ°ã«æºã¡ãçµ¶ããé²åãããŠã§ãããŒã¹ã®ã°ã©ãã£ãã¯ã¹ã®äžçã«ãããŠãWebGLã¯åºç€ãšãªããã¯ãããžãŒãšããŠååšããäžçäžã®éçºè ããã©ãŠã¶å ã§çŽæ¥ãèŠäºã§ã€ã³ã¿ã©ã¯ãã£ããª3Däœéšãäœæã§ããããã«ããŸããæ²¡å ¥åã²ãŒã ç°å¢ãè€éãªç§åŠçèŠèŠåãããåçãªããŒã¿ããã·ã¥ããŒããé åçãªeã³ããŒã¹è£œåã³ã³ãã£ã®ã¥ã¬ãŒã¿ãŒãŸã§ãWebGLã®æ©èœã¯çã«å€é©ããããããŸãããã ããç¹ã«è€éãªã°ããŒãã«ã¢ããªã±ãŒã·ã§ã³ã®å Žåããã®å¯èœæ§ãæå€§éã«åŒãåºãã«ã¯ãèŠéããããã¡ãªåŽé¢ãã€ãŸãå¹ççãªã·ã§ãŒããŒãªãœãŒã¹ã®ãã€ã³ãã£ã³ã°ãšç®¡çãéåžžã«éèŠã«ãªããŸãã
WebGLã¢ããªã±ãŒã·ã§ã³ãGPUã®ã¡ã¢ãªããã³åŠçãŠããããšã©ã®ããã«çžäºäœçšããããæé©åããããšã¯ãåãªãé«åºŠãªãã¯ããã¯ã§ã¯ãããŸãããããŸããŸãªããã€ã¹ããããã¯ãŒã¯æ¡ä»¶ã§ãã¹ã ãŒãºã§é«ãã¬ãŒã ã¬ãŒãã®ãšã¯ã¹ããªãšã³ã¹ãæäŸããããã®åºæ¬çãªèŠä»¶ã§ãããã€ãŒããªãªãœãŒã¹åŠçã¯ã匷åãªããŒããŠã§ã¢ã«é¢ä¿ãªããããã©ãŒãã³ã¹ã®ããã«ããã¯ããã¬ãŒã ã®ãããããããã³ãã©ã¹ãã¬ãŒã·ã§ã³ã®ããŸããŠãŒã¶ãŒãšã¯ã¹ããªãšã³ã¹ã«ããã«ç¹ããå¯èœæ§ããããŸãããã®å æ¬çãªã¬ã€ãã§ã¯ãWebGLã·ã§ãŒããŒãªãœãŒã¹ãã€ã³ãã£ã³ã°ã®è€éããæ·±ãæãäžããåºç€ãšãªãã¡ã«ããºã ã調æ»ããäžè¬çãªèœãšã穎ãç¹å®ããã¢ããªã±ãŒã·ã§ã³ã®ããã©ãŒãã³ã¹ãæ°ããªé«ã¿ã«åŒãäžããããã®é«åºŠãªæŠç¥ãæããã«ããŸãã
WebGLãªãœãŒã¹ãã€ã³ãã£ã³ã°ã®çè§£ïŒã³ã¢ã³ã³ã»ãã
WebGLã¯ãæ¬è³ªçã«ã¹ããŒããã·ã³ã¢ãã«ã§åäœããŸããããã§ã¯ãã°ããŒãã«èšå®ãšãªãœãŒã¹ã¯ãGPUã«ãããŒã³ãã³ããçºè¡ããåã«æ§æãããŸããããªãœãŒã¹ãã€ã³ãã£ã³ã°ããšã¯ãã¢ããªã±ãŒã·ã§ã³ã®ããŒã¿ïŒé ç¹ããã¯ã¹ãã£ããŠããã©ãŒã å€ïŒãGPUã®ã·ã§ãŒããŒããã°ã©ã ã«æ¥ç¶ããã¬ã³ããªã³ã°ã®ããã«ã¢ã¯ã»ã¹å¯èœã«ããããã»ã¹ãæããŸããããã¯ãJavaScriptããžãã¯ãšããŒã¬ãã«ã°ã©ãã£ãã¯ã¹ãã€ãã©ã€ã³éã®éèŠãªãã³ãã·ã§ã€ã¯ã§ãã
WebGLã«ãããããªãœãŒã¹ããšã¯ïŒ
WebGLã®ãªãœãŒã¹ã«ã€ããŠè©±ããšããäž»ã«ãGPUãã·ãŒã³ãã¬ã³ããªã³ã°ããããã«å¿ èŠãªãããã€ãã®éèŠãªã¿ã€ãã®ããŒã¿ãšãªããžã§ã¯ããæããŸãã
- ãããã¡ãŒãªããžã§ã¯ãïŒVBOãIBOïŒïŒãããã¯ãé ç¹ããŒã¿ïŒäœçœ®ãæ³ç·ãUVãè²ïŒãšã€ã³ããã¯ã¹ããŒã¿ïŒäžè§åœ¢ã®æ¥ç¶æ§ãå®çŸ©ïŒãæ ŒçŽããŸãã
- ãã¯ã¹ãã£ãªããžã§ã¯ãïŒãããã¯ãã·ã§ãŒããŒããµãŒãã§ã¹ã圩è²ããããã«ãµã³ããªã³ã°ããç»åããŒã¿ïŒWebGL2ã®2Dããã¥ãŒããããã3Dãã¯ã¹ãã£ïŒãä¿æããŸãã
- ããã°ã©ã ãªããžã§ã¯ãïŒã³ã³ãã€ã«ããã³ãªã³ã¯ãããé ç¹ã·ã§ãŒããŒãšãã©ã°ã¡ã³ãã·ã§ãŒããŒã§ããããžãªã¡ããªã®åŠçæ¹æ³ãšåœ©è²æ¹æ³ãå®çŸ©ããŸãã
- ãŠããã©ãŒã 倿°ïŒåäžã®ãããŒã³ãŒã«ã®ãã¹ãŠã®é ç¹ãŸãã¯ãã©ã°ã¡ã³ãã§äžå®ã§ããåäžã®å€ãŸãã¯å€ã®å°ããªé åïŒå€æè¡åãã©ã€ãã®äœçœ®ããããªã¢ã«ã®ããããã£ãªã©ïŒã
- ãµã³ãã©ãŒãªããžã§ã¯ãïŒWebGL2ïŒïŒãããã¯ããã¯ã¹ãã£ãã©ã¡ãŒã¿ãŒïŒãã£ã«ã¿ãªã³ã°ãã©ããã³ã°ïŒããã¯ã¹ãã£ããŒã¿èªäœããåé¢ããããæè»ã§å¹ççãªãã¯ã¹ãã£ç¶æ 管çãå¯èœã«ããŸãã
- ãŠããã©ãŒã ãããã¡ãŒãªããžã§ã¯ãïŒUBOïŒïŒWebGL2ïŒïŒãŠããã©ãŒã 倿°ã®ã³ã¬ã¯ã·ã§ã³ãæ ŒçŽããããã«èšèšãããç¹å¥ãªãããã¡ãŒãªããžã§ã¯ããããå¹ççã«æŽæ°ããã³ãã€ã³ãã§ããŸãã
WebGLã¹ããŒããã·ã³ãšãã€ã³ãã£ã³ã°
WebGLã®ãã¹ãŠã®æäœã«ã¯ãå€ãã®å Žåãã°ããŒãã«ã¹ããŒããã·ã³ã®å€æŽãå«ãŸããŸããããšãã°ãé ç¹å±æ§ãã€ã³ã¿ãŒãæå®ãããããã¯ã¹ãã£ããã€ã³ããããããåã«ããŸããããããã®ãããã¡ãŒãªããžã§ã¯ããŸãã¯ãã¯ã¹ãã£ãªããžã§ã¯ããã¹ããŒããã·ã³ã®ç¹å®ã®ã¿ãŒã²ãããã€ã³ãã«ããã€ã³ããããå¿
èŠããããŸããããã«ãããåŸç¶ã®æäœã®ã¢ã¯ãã£ããªãªããžã§ã¯ãã«ãªããŸããããšãã°ãgl.bindBuffer(gl.ARRAY_BUFFER, myVBO);ã¯ãmyVBOãçŸåšã®ã¢ã¯ãã£ããªé ç¹ãããã¡ãŒã«ããŸããgl.vertexAttribPointerãªã©ã®åŸç¶ã®åŒã³åºãã¯ãmyVBOã«å¯ŸããŠæäœãè¡ããŸãã
çŽæçã§ã¯ãããŸããããã®ç¶æ ããŒã¹ã®ã¢ãããŒãã¯ãã¢ã¯ãã£ããªãªãœãŒã¹ïŒå¥ã®ãã¯ã¹ãã£ãæ°ããã·ã§ãŒããŒããã°ã©ã ããŸãã¯å¥ã®é ç¹ãããã¡ãŒã®ã»ããïŒãåãæ¿ãããã³ã«ãGPUãã©ã€ããŒãå éšç¶æ ãæŽæ°ããå¿ èŠãããããšãæå³ããŸãããããã®ç¶æ ã®å€æŽã¯ãåå¥ã«ã¿ããšå°ããªãã®ã§ãã£ãŠããæ¥éã«èç©ãããç¹ã«å€ãã®ç°ãªããªããžã§ã¯ããŸãã¯ãããªã¢ã«ãå«ãè€éãªã·ãŒã³ã§ã¯ãé倧ãªããã©ãŒãã³ã¹ã®ãªãŒããŒãããã«ãªãå¯èœæ§ããããŸãããã®ã¡ã«ããºã ãçè§£ããããšã¯ããããæé©åããããã®æåã®ã¹ãããã§ãã
ãã€ãŒããªãã€ã³ãã£ã³ã°ã®ããã©ãŒãã³ã¹ã³ã¹ã
æèçãªæé©åãè¡ããªããšãæå³ããã«ããã©ãŒãã³ã¹ãäœäžããããã¿ãŒã³ã«é¥ãããããªããŸãããã€ã³ãã£ã³ã°ã«é¢é£ããããã©ãŒãã³ã¹äœäžã®äž»ãªåå ã¯æ¬¡ã®ãšããã§ãã
- éå°ãªç¶æ
倿ŽïŒ
gl.bindBufferãgl.bindTextureãgl.useProgramãåŒã³åºããã³ããŸãã¯åã ã®ãŠããã©ãŒã ãèšå®ãããã³ã«ãWebGLã®ç¶æ ã倿ŽããŠããŸãããããã®å€æŽã¯ç¡æã§ã¯ãããŸããããã©ãŠã¶ã®WebGLå®è£ ãšåºç€ãšãªãã°ã©ãã£ãã¯ã¹ãã©ã€ããŒãæ°ããç¶æ ãæ€èšŒããŠé©çšãããããCPUã®ãªãŒããŒããããçºçããŸãã - CPU-GPUéä¿¡ã®ãªãŒããŒãããïŒãŠããã©ãŒã å€ãŸãã¯ãããã¡ãŒããŒã¿ãé »ç¹ã«æŽæ°ãããšãCPUãšGPUéã§å€ãã®å°ããªããŒã¿è»¢éãçºçããå¯èœæ§ããããŸããææ°ã®GPUã¯éåžžã«é«éã§ãããCPUãšGPUéã®éä¿¡ãã£ãã«ã¯ãç¹ã«å€ãã®å°ãããŠç¬ç«ãã転éã®å Žåãé å»¶ãçºçããããšããããããŸãã
- ãã©ã€ããŒã®æ€èšŒãšæé©åã®éå£ïŒã°ã©ãã£ãã¯ã¹ãã©ã€ããŒã¯é«åºŠã«æé©åãããŠããŸãããæ£ç¢ºæ§ã確ä¿ããå¿ èŠããããŸããé »ç¹ãªç¶æ 倿Žã¯ããã©ã€ããŒãã¬ã³ããªã³ã°ã³ãã³ããæé©åããèœåã劚ããGPUã§ã®å®è¡ãã¹ã®å¹çãäœäžããå¯èœæ§ããããŸãã
äœåãã®å€æ§ãªè£œåã¢ãã«ã衚瀺ããã°ããŒãã«eã³ããŒã¹ãã©ãããã©ãŒã ãæ³åããŠã¿ãŠãã ãããåã¢ãã«ããã¹ãŠã®ãªãœãŒã¹ïŒã·ã§ãŒããŒããã°ã©ã ãè€æ°ã®ãã¯ã¹ãã£ãããŸããŸãªãããã¡ãŒãããã³æ°åã®ãŠããã©ãŒã ïŒã®å®å šãªåãã€ã³ãã£ã³ã°ãããªã¬ãŒããå Žåãã¢ããªã±ãŒã·ã§ã³ã¯åæ¢ããŸãããã®ã·ããªãªã¯ãæŠç¥çãªãªãœãŒã¹ç®¡çã®å¿ èŠæ§ã匷調ããŠããŸãã
WebGLã®ã³ã¢ãªãœãŒã¹ãã€ã³ãã£ã³ã°ã¡ã«ããºã ïŒããæ·±ã
WebGLã§ãªãœãŒã¹ããã€ã³ãããã³æäœãããäž»ãªæ¹æ³ã調ã¹ãŠãããã©ãŒãã³ã¹ãžã®åœ±é¿ã匷調ããŸãããã
ãŠããã©ãŒã ãšãŠããã©ãŒã ãããã¯ïŒUBOïŒ
ãŠããã©ãŒã ã¯ããããŒã³ãŒã«ããšã«å€æŽã§ããã·ã§ãŒããŒããã°ã©ã å ã®ã°ããŒãã«å€æ°ã§ããéåžžããªããžã§ã¯ãã®ãã¹ãŠã®é ç¹ãŸãã¯ãã©ã°ã¡ã³ãã§äžå®ã§ãããããªããžã§ã¯ãããšãŸãã¯ãã¬ãŒã ããšã«å€åããããŒã¿ã«äœ¿çšãããŸãïŒã¢ãã«è¡åãã«ã¡ã©äœçœ®ãã©ã€ãã®è²ãªã©ïŒã
-
åã
ã®ãŠããã©ãŒã ïŒWebGL1ã§ã¯ããŠããã©ãŒã ã¯
gl.uniform1fãgl.uniform3fvãgl.uniformMatrix4fvãªã©ã®é¢æ°ã䜿çšããŠ1ã€ãã€èšå®ãããŸãããããã®åŒã³åºãã®ããããã¯ãå€ãã®å ŽåãCPU-GPUããŒã¿è»¢éãšç¶æ 倿Žã«å€æãããŸããæ°åã®ãŠããã©ãŒã ãæã€è€éãªã·ã§ãŒããŒã®å Žåãããã«ããããªãã®ãªãŒããŒããããçºçããå¯èœæ§ããããŸããäŸïŒãªããžã§ã¯ãããšã«å€æè¡åãšè²ãæŽæ°ããŸãã
gl.uniformMatrix4fv(locationMatrix, false, matrixData); gl.uniform3fv(locationColor, colorData);ããããã¬ãŒã ããšã«æ°çŸã®ãªããžã§ã¯ãã«å¯ŸããŠè¡ããšãç©ã¿éãªããŸãã -
WebGL2ïŒãŠããã©ãŒã ãããã¡ãŒãªããžã§ã¯ãïŒUBOïŒïŒWebGL2ã§å°å
¥ãããéèŠãªæé©åã§ããUBOã䜿çšãããšãè€æ°ã®ãŠããã©ãŒã 倿°ãåäžã®ãããã¡ãŒãªããžã§ã¯ãã«ã°ã«ãŒãåã§ããŸããæ¬¡ã«ããã®ãããã¡ãŒãç¹å®ã®ãã€ã³ãã£ã³ã°ãã€ã³ãã«ãã€ã³ãããå
šäœãšããŠæŽæ°ã§ããŸãã倿°ã®åã
ã®ãŠããã©ãŒã åŒã³åºãã®ä»£ããã«ãUBOããã€ã³ãããããã«1åãããŒã¿ãæŽæ°ããããã«1ååŒã³åºããŸãã
å©ç¹ïŒç¶æ 倿Žãå°ãªããããŒã¿è»¢éãããå¹ççã§ããUBOã¯ãè€æ°ã®ã·ã§ãŒããŒããã°ã©ã éã§ãŠããã©ãŒã ããŒã¿ãå ±æããããšãå¯èœã«ããåé·ãªããŒã¿ã¢ããããŒããåæžããŸãããããã¯ãã«ã¡ã©è¡åïŒãã¥ãŒããããžã§ã¯ã·ã§ã³ïŒãŸãã¯ã©ã€ããã©ã¡ãŒã¿ãŒãªã©ããã°ããŒãã«ããŠããã©ãŒã ã«ç¹ã«å¹æçã§ãããã·ãŒã³å šäœãŸãã¯ã¬ã³ããªã³ã°ãã¹å šäœã§äžå®ã§ããããšããããããŸãã
UBOã®ãã€ã³ãã£ã³ã°ïŒããã«ã¯ããããã¡ãŒã®äœæããŠããã©ãŒã ããŒã¿ã®å ¥åãããã³
gl.bindBufferBase(gl.UNIFORM_BUFFER, bindingPoint, uboBuffer);ããã³gl.uniformBlockBinding(program, uniformBlockIndex, bindingPoint);ã䜿çšããŠãã·ã§ãŒããŒãšã°ããŒãã«WebGLã³ã³ããã¹ãå ã®ç¹å®ã®ãã€ã³ãã£ã³ã°ãã€ã³ããšã®é¢é£ä»ããå«ãŸããŸãã
é ç¹ãããã¡ãŒãªããžã§ã¯ãïŒVBOïŒãšã€ã³ããã¯ã¹ãããã¡ãŒãªããžã§ã¯ãïŒIBOïŒ
VBOã¯é ç¹å±æ§ïŒäœçœ®ãæ³ç·ãªã©ïŒãæ ŒçŽããIBOã¯é ç¹ãæç»ãããé åºãå®çŸ©ããã€ã³ããã¯ã¹ãæ ŒçŽããŸãããããã¯ããžãªã¡ããªãã¬ã³ããªã³ã°ããããã®åºæ¬ã§ãã
-
ãã€ã³ãã£ã³ã°ïŒVBOã¯
gl.bindBufferã䜿çšããŠgl.ARRAY_BUFFERã«ãã€ã³ããããIBOã¯gl.ELEMENT_ARRAY_BUFFERã«ãã€ã³ããããŸããVBOããã€ã³ãããåŸãgl.vertexAttribPointerã䜿çšããŠããã®ãããã¡ãŒå ã®ããŒã¿ãé ç¹ã·ã§ãŒããŒå ã®å±æ§ã«ã©ã®ããã«ããããããããèšè¿°ããgl.enableVertexAttribArrayã䜿çšããŠãããã®å±æ§ãæå¹ã«ããŸããããã©ãŒãã³ã¹ãžã®åœ±é¿ïŒã¢ã¯ãã£ããªVBOãŸãã¯IBOãé »ç¹ã«åãæ¿ãããšããã€ã³ãã£ã³ã°ã³ã¹ããçºçããŸããããããã«ç¬èªã®VBO/IBOãæã€ãå€ãã®å°ãããŠç°ãªãã¡ãã·ã¥ãã¬ã³ããªã³ã°ããŠããå Žåããããã®é »ç¹ãªãã€ã³ããããã«ããã¯ã«ãªãå¯èœæ§ããããŸãããžãªã¡ããªãããå°ãªãããã倧ããªãããã¡ãŒã«çµ±åããããšã¯ãå€ãã®å ŽåãéèŠãªæé©åã§ãã
ãã¯ã¹ãã£ãšãµã³ãã©ãŒ
ãã¯ã¹ãã£ã¯ãµãŒãã§ã¹ã«èŠèŠçãªè©³çްãæäŸããŸããå¹ççãªãã¯ã¹ãã£ç®¡çã¯ããªã¢ã«ãªã¬ã³ããªã³ã°ã«äžå¯æ¬ ã§ãã
-
ãã¯ã¹ãã£ãŠãããïŒGPUã«ã¯ããã¯ã¹ãã£ããã€ã³ãã§ããã¹ãããã®ãããªãéãããæ°ã®ãã¯ã¹ãã£ãŠãããããããŸãããã¯ã¹ãã£ã䜿çšããã«ã¯ããŸããã¯ã¹ãã£ãŠããããã¢ã¯ãã£ãã«ãïŒäŸïŒ
gl.activeTexture(gl.TEXTURE0);ïŒã次ã«ãã®ãŠãããã«ãã¯ã¹ãã£ããã€ã³ããïŒgl.bindTexture(gl.TEXTURE_2D, myTexture);ïŒãæåŸã«ã·ã§ãŒããŒã«ãµã³ããªã³ã°ãããŠããããæç€ºããŸãïŒãŠããã0ã®å Žåã¯gl.uniform1i(samplerUniformLocation, 0);ïŒãããã©ãŒãã³ã¹ãžã®åœ±é¿ïŒ
gl.activeTextureãšgl.bindTextureã®ååŒã³åºãã¯ç¶æ 倿Žã§ãããããã®åãæ¿ããæå°éã«æããããšãäžå¯æ¬ ã§ããå€ãã®ãŠããŒã¯ãªãã¯ã¹ãã£ãæã€è€éãªã·ãŒã³ã®å Žåãããã¯å€§ããªèª²é¡ã«ãªãå¯èœæ§ããããŸãã -
ãµã³ãã©ãŒïŒWebGL2ïŒïŒWebGL2ã§ã¯ããµã³ãã©ãŒãªããžã§ã¯ãã¯ããã¯ã¹ãã£ãã©ã¡ãŒã¿ãŒïŒãã£ã«ã¿ãªã³ã°ãã©ããã³ã°ã¢ãŒããªã©ïŒããã¯ã¹ãã£ããŒã¿èªäœããåé¢ããŸããã€ãŸããç°ãªããã©ã¡ãŒã¿ãŒãæã€è€æ°ã®ãµã³ãã©ãŒãªããžã§ã¯ããäœæãã
gl.bindSampler(textureUnit, mySampler);ã䜿çšããŠãã¯ã¹ãã£ãŠãããã«åå¥ã«ãã€ã³ãã§ããŸããããã«ããããã¯ã¹ãã£èªäœãåãã€ã³ãããããgl.texParameteriãç¹°ãè¿ãåŒã³åºãããããã«ãç°ãªããã©ã¡ãŒã¿ãŒã§åäžã®ãã¯ã¹ãã£ããµã³ããªã³ã°ã§ããŸããå©ç¹ïŒãã©ã¡ãŒã¿ãŒã®ã¿ã調æŽããå¿ èŠãããå Žåãç¹ã«é å»¶ã·ã§ãŒãã£ã³ã°ããã¹ãããã»ãã·ã³ã°ãšãã§ã¯ããªã©ã®ãã¯ããã¯ã§ãåããã¯ã¹ãã£ãç°ãªãæ¹æ³ã§ãµã³ããªã³ã°ãããå¯èœæ§ãããå Žåããã¯ã¹ãã£ã®ç¶æ 倿ŽãåæžãããŸãã
ã·ã§ãŒããŒããã°ã©ã
ã·ã§ãŒããŒããã°ã©ã ïŒã³ã³ãã€ã«ãããé ç¹ã·ã§ãŒããŒãšãã©ã°ã¡ã³ãã·ã§ãŒããŒïŒã¯ããªããžã§ã¯ãå šäœã®ã¬ã³ããªã³ã°ããžãã¯ãå®çŸ©ããŸãã
-
ãã€ã³ãã£ã³ã°ïŒ
gl.useProgram(myProgram);ã䜿çšããŠãã¢ã¯ãã£ããªã·ã§ãŒããŒããã°ã©ã ãéžæããŸããåŸç¶ã®ãã¹ãŠã®ãããŒã³ãŒã«ã¯ãå¥ã®ããã°ã©ã ããã€ã³ãããããŸã§ããã®ããã°ã©ã ã䜿çšããŸããããã©ãŒãã³ã¹ãžã®åœ±é¿ïŒã·ã§ãŒããŒããã°ã©ã ã®åãæ¿ãã¯ãæãã³ã¹ãã®ãããç¶æ 倿Žã®1ã€ã§ããGPUã¯ããã€ãã©ã€ã³ã®äžéšãåæ§æããå¿ èŠãããããšãå€ããããã«ããå€§å¹ ãªå€±éãçºçããå¯èœæ§ããããŸãããããã£ãŠãããã°ã©ã ã®åãæ¿ããæå°éã«æããæŠç¥ã¯ãæé©åã«éåžžã«å¹æçã§ãã
WebGLãªãœãŒã¹ç®¡çã®ããã®é«åºŠãªæé©åæŠç¥
åºæ¬çãªã¡ã«ããºã ãšãã®ããã©ãŒãã³ã¹ã³ã¹ããçè§£ããã®ã§ãWebGLã¢ããªã±ãŒã·ã§ã³ã®å¹çãåçã«åäžãããããã®é«åºŠãªãã¯ããã¯ãæ€èšããŸãããã
1. ãããåŠçãšã€ã³ã¹ã¿ã³ã·ã³ã°ïŒãããŒã³ãŒã«ã®ãªãŒããŒãããã®åæž
ãããŒã³ãŒã«ã®æ°ïŒgl.drawArraysãŸãã¯gl.drawElementsïŒã¯ãWebGLã¢ããªã±ãŒã·ã§ã³ã§æã倧ããªããã«ããã¯ã«ãªãããšããããããŸããåãããŒã³ãŒã«ã«ã¯ãCPU-GPUéä¿¡ããã©ã€ããŒã®æ€èšŒãããã³ç¶æ
倿Žããã®åºå®ãªãŒããŒãããããããŸãããããŒã³ãŒã«ã®åæžãæãéèŠã§ãã
- éå°ãªãããŒã³ãŒã«ã®åé¡ïŒäœåãã®åã ã®æšãããæ£®ãã¬ã³ããªã³ã°ããããšãæ³åããŠãã ãããåæšãåå¥ã®ãããŒã³ãŒã«ã§ããå ŽåãCPUã¯GPUãã¬ã³ããªã³ã°ã«è²»ããæéããããGPUã®ã³ãã³ããæºåããã®ã«å€ãã®æéãè²»ããå¯èœæ§ããããŸãã
-
ãžãªã¡ããªãããåŠçïŒããã«ã¯ãè€æ°ã®å°ããªã¡ãã·ã¥ãåäžã®å€§ããªãããã¡ãŒãªããžã§ã¯ãã«çµåããããšãå«ãŸããŸãã100åã®å°ããªãã¥ãŒãã100åã®åå¥ã®ãããŒã³ãŒã«ãšããŠæç»ãã代ããã«ãé ç¹ããŒã¿ã1ã€ã®å€§ããªãããã¡ãŒã«ããŒãžããåäžã®ãããŒã³ãŒã«ã§æç»ããŸããããã«ã¯ãã·ã§ãŒããŒã§å€æã調æŽãããã远å ã®å±æ§ã䜿çšããŠããŒãžããããªããžã§ã¯ããåºå¥ããå¿
èŠããããŸãã
ã¢ããªã±ãŒã·ã§ã³ïŒéçãªé¢šæ¯èŠçŽ ãåäžã®ã¢ãã¡ãŒã·ã§ã³ãšã³ãã£ãã£çšã«ããŒãžããããã£ã©ã¯ã¿ãŒããŒãã
-
ãããªã¢ã«ãããåŠçïŒåçãªã·ãŒã³ã«ãšã£ãŠããå®çšçãªã¢ãããŒããåããããªã¢ã«ïŒã€ãŸããåãã·ã§ãŒããŒããã°ã©ã ããã¯ã¹ãã£ãããã³ã¬ã³ããªã³ã°ç¶æ
ïŒãå
±æãããªããžã§ã¯ããã°ã«ãŒãåããããããäžç·ã«ã¬ã³ããªã³ã°ããŸããããã«ãããã³ã¹ãã®ãããã·ã§ãŒããŒãšãã¯ã¹ãã£ã®åãæ¿ããæå°éã«æããããŸãã
ããã»ã¹ïŒã·ãŒã³ã®ãªããžã§ã¯ãããããªã¢ã«ãŸãã¯ã·ã§ãŒããŒããã°ã©ã ã§ãœãŒãããæåã«æåã®ãããªã¢ã«ã®ãã¹ãŠã®ãªããžã§ã¯ããã¬ã³ããªã³ã°ããæ¬¡ã«2çªç®ã®ãããªã¢ã«ã®ãã¹ãŠã®ãªããžã§ã¯ããã¬ã³ããªã³ã°ããŸããããã«ãããã·ã§ãŒããŒãŸãã¯ãã¯ã¹ãã£ããã€ã³ãããããšãå¯èœãªéãå€ãã®ãããŒã³ãŒã«ã§åå©çšãããããšãä¿èšŒãããŸãã
-
ããŒããŠã§ã¢ã€ã³ã¹ã¿ã³ã·ã³ã°ïŒWebGL2ïŒïŒç°ãªãããããã£ïŒäœçœ®ãã¹ã±ãŒã«ãè²ïŒãæã€å€ãã®åäžãŸãã¯éåžžã«ãã䌌ããªããžã§ã¯ããã¬ã³ããªã³ã°ããå Žåãã€ã³ã¹ã¿ã³ã·ã³ã°ã¯éåžžã«åŒ·åã§ããåãªããžã§ã¯ãã®ããŒã¿ãåå¥ã«éä¿¡ãã代ããã«ãããŒã¹ãžãªã¡ããªã1åéä¿¡ããæ¬¡ã«ã€ã³ã¹ã¿ã³ã¹ããšã®ããŒã¿ã®å°ããªé
åïŒããšãã°ãåã€ã³ã¹ã¿ã³ã¹ã®å€æè¡åïŒã屿§ãšããŠæäŸããŸãã
ä»çµã¿ïŒéåžžã©ããã«ãžãªã¡ããªãããã¡ãŒãèšå®ããŸããæ¬¡ã«ãã€ã³ã¹ã¿ã³ã¹ããšã«å€æŽããã屿§ã®å Žåã¯ã
gl.vertexAttribDivisor(attributeLocation, 1);ïŒãŸãã¯ãæŽæ°é »åºŠãäœãããå Žåã¯ãããé«ã逿°ïŒã䜿çšããŸããããã¯ãWebGLã«ãã®å±æ§ãé ç¹ããšã«1åã§ã¯ãªããã€ã³ã¹ã¿ã³ã¹ããšã«1åé²ããããã«æç€ºããŸãã ãããŒã³ãŒã«ã¯ãgl.drawArraysInstanced(mode, first, count, instanceCount);ãŸãã¯gl.drawElementsInstanced(mode, count, type, offset, instanceCount);ã«ãªããŸããäŸïŒããŒãã£ã¯ã«ã·ã¹ãã ïŒéšãéªãç«ïŒããã£ã©ã¯ã¿ãŒã®çŸ€è¡ãèãè±ã®ãã£ãŒã«ããæ°åã®UIèŠçŽ ããã®ãã¯ããã¯ã¯ããã®å¹çæ§ããã髿§èœã°ã©ãã£ãã¯ã¹ã§ã°ããŒãã«ã«æ¡çšãããŠããŸãã
2. ãŠããã©ãŒã ãããã¡ãŒãªããžã§ã¯ãïŒUBOïŒã®å¹æçãªæŽ»çšïŒWebGL2ïŒ
UBOã¯ãWebGL2ã§ã®ãŠããã©ãŒã 管çã®ã²ãŒã ãã§ã³ãžã£ãŒã§ãããã®åã¯ãå€ãã®ãŠããã©ãŒã ãåäžã®GPUãããã¡ãŒã«ããã±ãŒãžåãããã€ã³ãã£ã³ã°ãšæŽæ°ã³ã¹ããæå°éã«æããèœåã«ãããŸãã
-
UBOã®æ§é åïŒæŽæ°é »åºŠãšã¹ã³ãŒãã«åºã¥ããŠããŠããã©ãŒã ãè«çãããã¯ã«ç·šæããŸãã
- ã·ãŒã³ããšã®UBOïŒã°ããŒãã«ã©ã€ãã®æ¹åãã¢ã³ããšã³ãã«ã©ãŒãæéãªã©ããã£ãã«å€æŽãããªããŠããã©ãŒã ãå«ãŸããŠããŸãããã¬ãŒã ããšã«1åãã€ã³ãããŸãã
- ãã¥ãŒããšã®UBOïŒãã¥ãŒããã³ãããžã§ã¯ã·ã§ã³è¡åãªã©ã®ã«ã¡ã©åºæã®ããŒã¿çšãã«ã¡ã©ãŸãã¯ãã¥ãŒããšã«1åæŽæ°ããŸãïŒããšãã°ãåå²ç»é¢ã¬ã³ããªã³ã°ãŸãã¯åå°ãããŒããããå ŽåïŒã
- ãããªã¢ã«ããšã®UBOïŒãããªã¢ã«ã«åºæã®ããããã£ïŒè²ãå æ²¢ããã¯ã¹ãã£ã¹ã±ãŒã«ïŒçšããããªã¢ã«ãåãæ¿ãããšãã«æŽæ°ããŸãã
- ãªããžã§ã¯ãããšã®UBOïŒåã ã®ãªããžã§ã¯ã倿ã§ã¯äžè¬çã§ã¯ãããŸããïŒïŒå¯èœã§ãããåã ã®ãªããžã§ã¯ã倿ã¯ãUBOãé »ç¹ã«å€æŽããããªããžã§ã¯ãããšã®äžæã®ããŒã¿ã«äœ¿çšãããšãªãŒããŒããããçºçãããããå€ãã®å Žåãã€ã³ã¹ã¿ã³ã·ã³ã°ã䜿çšããããã¢ãã«è¡åãåçŽãªãŠããã©ãŒã ãšããŠæž¡ãæ¹ãé©ããŠããŸãã
-
UBOã®æŽæ°ïŒUBOãåäœæãã代ããã«ã
gl.bufferSubData(gl.UNIFORM_BUFFER, offset, data);ã䜿çšããŠããããã¡ãŒã®ç¹å®ã®éšåãæŽæ°ããŸããããã«ãããã¡ã¢ãªã®åå²ãåœãŠãšãããã¡ãŒå šäœã®è»¢éã®ãªãŒããŒããããåé¿ãããæŽæ°ãéåžžã«å¹ççã«ãªããŸãããã¹ããã©ã¯ãã£ã¹ïŒUBOã®é 眮èŠä»¶ã«æ³šæããŠãã ããïŒ
gl.getProgramParameter(program, gl.UNIFORM_BLOCK_DATA_SIZE);ããã³gl.getProgramParameter(program, gl.UNIFORM_BLOCK_BINDING);ã圹ç«ã¡ãŸãïŒãGPUã®äºæãããã¬ã€ã¢ãŠãã«åãããŠJavaScriptããŒã¿æ§é ïŒããšãã°ãFloat32ArrayïŒãåã蟌ã¿ãäºæããªãããŒã¿ã·ãããåé¿ããŸãã
3. ãã¯ã¹ãã£ã¢ãã©ã¹ãšé åïŒã¹ããŒããªãã¯ã¹ãã£ç®¡ç
ãã¯ã¹ãã£ãã€ã³ããæå°éã«æããããšã¯ã圱é¿ã®å€§ããæé©åã§ãããã¯ã¹ãã£ã¯ãªããžã§ã¯ãã®èŠèŠçãªã¢ã€ãã³ãã£ãã£ãå®çŸ©ããããšãå€ããé »ç¹ã«åãæ¿ãããšã³ã¹ããããããŸãã
-
ãã¯ã¹ãã£ã¢ãã©ã¹ïŒè€æ°ã®å°ããªãã¯ã¹ãã£ïŒã¢ã€ã³ã³ãå°åœ¢ãããããã£ã©ã¯ã¿ãŒã®è©³çްãªã©ïŒãåäžã®å€§ããªãã¯ã¹ãã£ç»åã«çµåããŸããæ¬¡ã«ãã·ã§ãŒããŒã§ãã¢ãã©ã¹ã®ç®çã®éšåããµã³ããªã³ã°ããããã®æ£ããUV座æšãèšç®ããŸããã€ãŸãã1ã€ã®å€§ããªãã¯ã¹ãã£ã®ã¿ããã€ã³ããã
gl.bindTextureåŒã³åºããå€§å¹ ã«åæžããŸããå©ç¹ïŒãã¯ã¹ãã£ãã€ã³ãã®åæžãGPUã§ã®ãã£ãã·ã¥ããŒã«ãªãã£ã®åäžãããŒãã®é«éåã®å¯èœæ§ïŒå€ãã®å°ããªãã¯ã¹ãã£ã§ã¯ãªãã1ã€ã®å€§ããªãã¯ã¹ãã£ïŒã ã¢ããªã±ãŒã·ã§ã³ïŒUIèŠçŽ ãã²ãŒã ã¹ãã©ã€ãã·ãŒããåºå€§ãªé¢šæ¯ã®ç°å¢ã®è©³çްãããŸããŸãªãµãŒãã§ã¹ããããã£ãåäžã®ãããªã¢ã«ã«ãããã³ã°ããŸãã
-
ãã¯ã¹ãã£é
åïŒWebGL2ïŒïŒWebGL2ã§å©çšå¯èœãªããã«åŒ·åãªãã¯ããã¯ã§ãããã¯ã¹ãã£é
åã䜿çšãããšãåããµã€ãºãšåœ¢åŒã®è€æ°ã®2Dãã¯ã¹ãã£ãåäžã®ãã¯ã¹ãã£ãªããžã§ã¯ãå
ã«æ ŒçŽã§ããŸããæ¬¡ã«ãã·ã§ãŒããŒã§ã远å ã®ãã¯ã¹ãã£åº§æšã䜿çšããŠããã®é
åã®åã
ã®ãã¬ã€ã€ãŒãã«ã¢ã¯ã»ã¹ã§ããŸãã
ã¬ã€ã€ãŒãžã®ã¢ã¯ã»ã¹ïŒGLSLã§ã¯ã
sampler2DArrayã®ãããªãµã³ãã©ãŒã䜿çšããtexture(myTextureArray, vec3(uv.x, uv.y, layerIndex));ã§ã¢ã¯ã»ã¹ããŸãã å©ç¹ïŒã¢ãã©ã¹ã«é¢é£ä»ããããè€éãªUV座æšã®åãããã³ã°ã®å¿ èŠæ§ãæé€ãããã¯ã¹ãã£ã®ã»ããã管çããããã®ããã¯ãªãŒã³ãªæ¹æ³ãæäŸããã·ã§ãŒããŒã§ã®åçãªãã¯ã¹ãã£éžæã«æé©ã§ãïŒããšãã°ããªããžã§ã¯ãIDã«åºã¥ããŠç°ãªããããªã¢ã«ãã¯ã¹ãã£ãéžæããŸãïŒãå°åœ¢ã¬ã³ããªã³ã°ããã«ãŒã«ã·ã¹ãã ããŸãã¯ãªããžã§ã¯ãã®ããªãšãŒã·ã§ã³ã«æé©ã§ãã
4. æ°žç¶çãªãããã¡ãŒãããã³ã°ïŒWebGLã®æŠå¿µïŒ
WebGLã¯ãäžéšã®ãã¹ã¯ãããGL APIã®ãããªæç€ºçãªãæ°žç¶çã«ãããã³ã°ããããããã¡ãŒããå ¬éããŠããŸããããçµ¶ãéãªãåå²ãåœãŠãªãã«GPUããŒã¿ãå¹ççã«æŽæ°ãããšããåºç€ãšãªãæŠå¿µã¯äžå¯æ¬ ã§ãã
-
gl.bufferDataã®æå°åïŒãã®åŒã³åºãã¯ãå€ãã®å ŽåãGPUã¡ã¢ãªã®åå²ãåœãŠãšããŒã¿å šäœã®ã³ããŒãæå³ããŸããé »ç¹ã«å€æŽãããåçããŒã¿ã®å Žåã¯ãå¯èœãªéããæ°ãããŠå°ãããµã€ãºã§gl.bufferDataãåŒã³åºãããšãé¿ããŠãã ããã代ããã«ãäžåºŠã«ååã«å€§ããªãããã¡ãŒãå²ãåœãŠïŒããšãã°ãgl.STATIC_DRAWãŸãã¯gl.DYNAMIC_DRAWã®äœ¿çšãã³ãããã ããã³ãã¯å€ãã®å Žåå©èšã§ãïŒã次ã«gl.bufferSubDataãæŽæ°ã«äœ¿çšããŸããgl.bufferSubDataã®è³¢æãªäœ¿çšïŒãã®é¢æ°ã¯ãæ¢åã®ãããã¡ãŒã®ãµãã¬ãžãªã³ãæŽæ°ããŸããåå²ãåœãŠãåé¿ãããããéšåçãªæŽæ°ã®å Žåã¯éåžžãgl.bufferDataãããå¹ççã§ãããã ããæŽæ°ããããšããŠãããããã¡ãŒãGPUãçŸåšäœ¿çšããŠããå Žåãé »ç¹ãªå°ããªgl.bufferSubDataåŒã³åºãã¯ãCPU-GPUåæã®å€±éã«ã€ãªããå¯èœæ§ããããŸãã - åçããŒã¿ã®ãããã«ãããã¡ãªã³ã°ããŸãã¯ããªã³ã°ãããã¡ãŒãïŒé«åºŠã«åçãªããŒã¿ïŒããšãã°ããã¬ãŒã ããšã«å€æŽãããããŒãã£ã¯ã«ã®äœçœ®ïŒã®å Žåã¯ã2ã€ä»¥äžã®ãããã¡ãŒãå²ãåœãŠãæŠç¥ã®äœ¿çšãæ€èšããŠãã ãããGPUã1ã€ã®ãããã¡ãŒããæç»ããŠããéããã1ã€ã®ãããã¡ãŒãæŽæ°ããŸããGPUãå®äºãããããããã¡ãŒã亀æããŸããããã«ãããGPUã倱éãããããšãªããç¶ç¶çãªããŒã¿æŽæ°ãå¯èœã«ãªããŸããããªã³ã°ãããã¡ãŒãã¯ãå圢ã«ããã€ãã®ãããã¡ãŒãæã¡ãããããç¶ç¶çã«åŸªç°ãããããšã§ãããæ¡åŒµããŸãã
5. ã·ã§ãŒããŒããã°ã©ã ã®ç®¡çãšé å
åè¿°ã®ããã«ãã·ã§ãŒããŒããã°ã©ã ã®åãæ¿ãã¯ã³ã¹ããããããŸããã€ã³ããªãžã§ã³ããªã·ã§ãŒããŒç®¡çã¯ãå€§å¹ ãªã²ã€ã³ãããããå¯èœæ§ããããŸãã
-
ããã°ã©ã ã®åãæ¿ãã®æå°åïŒæãç°¡åã§å¹æçãªæŠç¥ã¯ãã·ã§ãŒããŒããã°ã©ã ã§ã¬ã³ããªã³ã°ãã¹ãç·šæããããšã§ããããã°ã©ã Aã䜿çšãããã¹ãŠã®ãªããžã§ã¯ããã¬ã³ããªã³ã°ããæ¬¡ã«ããã°ã©ã Bã䜿çšãããã¹ãŠã®ãªããžã§ã¯ããã¬ã³ããªã³ã°ããŸãããã®ãããªã¢ã«ããŒã¹ã®ãœãŒãã¯ãå
ç¢ãªã¬ã³ãã©ãŒã®æåã®ã¹ããããšãªãå¯èœæ§ããããŸãã
å®è·µçãªäŸïŒã°ããŒãã«ãªå»ºç¯èŠèŠåãã©ãããã©ãŒã ã«ã¯ã倿°ã®å»ºç©ã®çš®é¡ãããå ŽåããããŸãã建ç©ããšã«ã·ã§ãŒããŒãåãæ¿ãã代ããã«ããã¬ã³ã¬ãã·ã§ãŒããŒã䜿çšãããã¹ãŠã®å»ºç©ããœãŒãããæ¬¡ã«ãã¬ã©ã¹ãã·ã§ãŒããŒã䜿çšãããã¹ãŠã®å»ºç©ããœãŒãããŸãã
-
ã·ã§ãŒããŒã®é åãšæ¡ä»¶ä»ããŠããã©ãŒã ïŒå Žåã«ãã£ãŠã¯ã1ã€ã®ã·ã§ãŒããŒã§ãããã«ç°ãªãã¬ã³ããªã³ã°ãã¹ãåŠçããå¿
èŠãããå ŽåããããŸãïŒããšãã°ãæ³ç·ãããã³ã°ã®æç¡ãç°ãªãç
§æã¢ãã«ïŒã2ã€ã®äž»ãªã¢ãããŒãããããŸãã
-
æ¡ä»¶ä»ããŠããã©ãŒã ãåãã1ã€ã®ãŠãŒããŒã·ã§ãŒããŒïŒãŠããã©ãŒã ãã©ã°ïŒããšãã°ã
uniform int hasNormalMap;ïŒãšGLSLifã¹ããŒãã¡ã³ãã䜿çšããŠããžãã¯ãåå²ãããåäžã®è€éãªã·ã§ãŒããŒãããã«ãããããã°ã©ã ã®åãæ¿ããåé¿ãããŸãããïŒGPUãå¯èœãªãã¹ãŠã®ãã¹ã«å¯ŸããŠã³ã³ãã€ã«ããå¿ èŠãããããïŒæé©ã§ã¯ãªãã·ã§ãŒããŒã³ã³ãã€ã«ãçºçãããããŠããã©ãŒã ã®æŽæ°ãå¢ãããããå¯èœæ§ããããŸãã -
ã·ã§ãŒããŒã®é åïŒå®è¡æãŸãã¯ã³ã³ãã€ã«æã«è€æ°ã®ç¹æ®ãªã·ã§ãŒããŒããã°ã©ã ãçæããŸãïŒããšãã°ã
shader_PBR_NoNormalMapãshader_PBR_WithNormalMapïŒãããã«ããã管çããã·ã§ãŒããŒããã°ã©ã ãå¢ãããœãŒããããŠããªãå Žåã¯ããã°ã©ã ã®åãæ¿ããå¢ããŸãããåããã°ã©ã ã¯ç¹å®ã®ã¿ã¹ã¯åãã«é«åºŠã«æé©åãããŠããŸãããã®ã¢ãããŒãã¯ããã€ãšã³ããšã³ãžã³ã§äžè¬çã§ãã
ãã©ã³ã¹ã®èª¿æŽïŒæé©ãªã¢ãããŒãã¯ãå€ãã®å Žåããã€ããªããæŠç¥ã«ãããŸããé »ç¹ã«å€æŽãããå°ããªããªãšãŒã·ã§ã³ã®å Žåã¯ããŠããã©ãŒã ã䜿çšããŸããå€§å¹ ã«ç°ãªãã¬ã³ããªã³ã°ããžãã¯ã®å Žåã¯ãåå¥ã®ã·ã§ãŒããŒã®é åãçæããŸãããããã¡ã€ãªã³ã°ã¯ãç¹å®ã®ã¢ããªã±ãŒã·ã§ã³ãšã¿ãŒã²ããããŒããŠã§ã¢ã«æé©ãªãã©ã³ã¹ã決å®ããããã®éµãšãªããŸãã
-
æ¡ä»¶ä»ããŠããã©ãŒã ãåãã1ã€ã®ãŠãŒããŒã·ã§ãŒããŒïŒãŠããã©ãŒã ãã©ã°ïŒããšãã°ã
6. é å»¶ãã€ã³ãã£ã³ã°ãšç¶æ ã®ãã£ãã·ã¥
ç¶æ ãã·ã³ãæ£ããæ§æãããŠããå Žåãå€ãã®WebGLæäœã¯åé·ã§ãããã¯ã¹ãã£ãã¢ã¯ãã£ããªãã¯ã¹ãã£ãŠãããã«ãã§ã«ãã€ã³ããããŠããã®ã«ããªããã¯ã¹ãã£ããã€ã³ãããã®ã§ããïŒ
-
é
å»¶ãã€ã³ãã£ã³ã°ïŒã¿ãŒã²ãããªãœãŒã¹ãçŸåšãã€ã³ããããŠãããªãœãŒã¹ãšç°ãªãå Žåã«ã®ã¿ãã€ã³ãã£ã³ã°ã³ãã³ããçºè¡ããWebGLåŒã³åºãã®ã©ãããŒãå®è£
ããŸããããšãã°ã
gl.bindTexture(gl.TEXTURE_2D, newTexture);ãåŒã³åºãåã«ãnewTextureãã¢ã¯ãã£ããªãã¯ã¹ãã£ãŠãããã®gl.TEXTURE_2Dã«å¯ŸããŠçŸåšãã€ã³ããããŠãããã¯ã¹ãã£ã§ãããã©ããã確èªããŸãã -
ã·ã£ããŠç¶æ
ã®ç¶æïŒé
å»¶ãã€ã³ãã£ã³ã°ã广çã«å®è£
ããã«ã¯ããã·ã£ããŠç¶æ
ããã€ãŸãã¢ããªã±ãŒã·ã§ã³ã«é¢ããéãWebGLã³ã³ããã¹ãã®çŸåšã®ç¶æ
ããã©ãŒãªã³ã°ããJavaScriptãªããžã§ã¯ããç¶æããå¿
èŠããããŸããçŸåšãã€ã³ããããŠããããã°ã©ã ãã¢ã¯ãã£ããªãã¯ã¹ãã£ãŠãããããŠãããããšã«ãã€ã³ããããŠãããã¯ã¹ãã£ãªã©ãä¿åããŸãããã€ã³ãã£ã³ã°ã³ãã³ããçºè¡ãããã³ã«ããã®ã·ã£ããŠç¶æ
ãæŽæ°ããŸããã³ãã³ããçºè¡ããåã«ãç®çã®ç¶æ
ãšã·ã£ããŠç¶æ
ãæ¯èŒããŸãã
泚æïŒå¹æçã§ãããå æ¬çãªã·ã£ããŠç¶æ ã®ç®¡çã¯ãã¬ã³ããªã³ã°ãã€ãã©ã€ã³ã«è€éããå ããå¯èœæ§ããããŸããæãã³ã¹ãã®ãããç¶æ 倿ŽïŒããã°ã©ã ããã¯ã¹ãã£ãUBOïŒã«æåã«çŠç¹ãåœãŠãŸãã
gl.getParameterãé »ç¹ã«äœ¿çšããŠçŸåšã®GLç¶æ ãç §äŒããããšã¯é¿ããŠãã ããããããã®åŒã³åºãèªäœãCPU-GPUåæã«ããé倧ãªãªãŒããŒããããçºçããå¯èœæ§ãããããã§ãã
å®éã®å®è£ ã«é¢ããèæ ®äºé ãšããŒã«
çè«çãªç¥èãè¶ ããŠãå®éçãªå¿çšãšç¶ç¶çãªè©äŸ¡ã¯ãçŸå®äžçã®ããã©ãŒãã³ã¹åäžã«äžå¯æ¬ ã§ãã
WebGLã¢ããªã±ãŒã·ã§ã³ã®ãããã¡ã€ãªã³ã°
枬å®ããªããã®ã¯æé©åã§ããŸããããããã¡ã€ãªã³ã°ã¯ãå®éã®ããã«ããã¯ãç¹å®ããããã«éèŠã§ãã
-
ãã©ãŠã¶ã®éçºè
ããŒã«ïŒãã¹ãŠã®äž»èŠãªãã©ãŠã¶ã¯ã匷åãªéçºè
ããŒã«ãæäŸããŠããŸããWebGLã®å Žåã¯ãããã©ãŒãã³ã¹ãã¡ã¢ãªãããã³å€ãã®å Žåå°çšã®WebGLã€ã³ã¹ãã¯ã¿ãŒã«é¢é£ããã»ã¯ã·ã§ã³ãæ¢ããŠãã ãããããšãã°ãChromeã®DevToolsã¯ããã¬ãŒã ããšã®ã¢ã¯ãã£ããã£ãèšé²ã§ãããããã©ãŒãã³ã¹ãã¿ããæäŸããCPU䜿çšçãGPUã¢ã¯ãã£ããã£ãJavaScriptå®è¡ãããã³WebGLåŒã³åºãã®ã¿ã€ãã³ã°ã瀺ããŸããFirefoxããå°çšã®WebGLããã«ãå«ãåªããããŒã«ãæäŸããŠããŸãã
ããã«ããã¯ã®ç¹å®ïŒç¹å®ã®WebGLåŒã³åºãïŒå€ãã®å°ããª
gl.uniform...åŒã³åºããé »ç¹ãªgl.useProgramããŸãã¯åºç¯ãªgl.bufferDataïŒã§ã®é·ãæéãæ¢ããŸããWebGLåŒã³åºãã«å¯Ÿå¿ããé«ãCPU䜿çšçã¯ãéå°ãªç¶æ 倿ŽãŸãã¯CPUåŽã®ããŒã¿æºåã瀺ããŠããããšããããããŸãã - GPUã¿ã€ã ã¹ã¿ã³ãã®ç §äŒïŒWebGL2 EXT_DISJOINT_TIMER_QUERY_WEBGL2ïŒïŒããæ£ç¢ºãªGPUåŽã®ã¿ã€ãã³ã°ã®ããã«ãWebGL2ã¯ç¹å®ã®ã³ãã³ããå®è¡ããGPUãè²»ãããå®éã®æéãç §äŒããæ¡åŒµæ©èœãæäŸããŸããããã«ãããCPUãªãŒããŒããããšçã®GPUããã«ããã¯ãåºå¥ã§ããŸãã
é©åãªããŒã¿æ§é ã®éžæ
WebGLã®ããŒã¿ãæºåããJavaScriptã³ãŒãã®å¹çããéèŠãªåœ¹å²ãæãããŸãã
-
åä»ãé
åïŒ
Float32ArrayãUint16Arrayãªã©ïŒïŒWebGLããŒã¿ã«ã¯åžžã«åä»ãé åã䜿çšããŠãã ããããããã¯ãã€ãã£ãC++åã«çŽæ¥ãããããã远å ã®å€æãªãŒããŒããããªãã«ãå¹ççãªã¡ã¢ãªè»¢éãšGPUã«ããçŽæ¥ã¢ã¯ã»ã¹ãå¯èœã«ããŸãã - ããŒã¿ã®å¹ççãªãããã³ã°ïŒé¢é£ããããŒã¿ãã°ã«ãŒãåããŸããããšãã°ãäœçœ®ãæ³ç·ãUVã®åå¥ã®ãããã¡ãŒã®ä»£ããã«ãã¬ã³ããªã³ã°ããžãã¯ãç°¡çŽ åããããã€ã³ãåŒã³åºããåæžãããå Žåã¯ãããããåäžã®VBOã«ã€ã³ã¿ãŒãªãŒãããããšãæ€èšããŠãã ããïŒãã ããããã¯ãã¬ãŒããªãã§ãããç°ãªã屿§ãç°ãªã段éã§ã¢ã¯ã»ã¹ãããå Žåã¯ãåå¥ã®ãããã¡ãŒã®æ¹ããã£ãã·ã¥ããŒã«ãªãã£ã«é©ããŠããå ŽåããããŸãïŒãUBOã®å Žåã¯ãããŒã¿ãè©°ããŠãããã³ã°ããŸããããããã¡ãŒãµã€ãºãæå°éã«æãããã£ãã·ã¥ããããåäžãããããã«ãé 眮ã«ãŒã«ã«åŸã£ãŠãã ããã
ãã¬ãŒã ã¯ãŒã¯ãšã©ã€ãã©ãª
äžçäžã®å€ãã®éçºè ããThree.jsãBabylon.jsãPlayCanvasãCesiumJSãªã©ã®WebGLã©ã€ãã©ãªãšãã¬ãŒã ã¯ãŒã¯ã掻çšããŠããŸãããããã®ã©ã€ãã©ãªã¯ãããŒã¬ãã«WebGL APIã®å€ããæœè±¡åããå€ãã®å Žåãããã§èª¬æããæé©åæŠç¥ïŒãããåŠçãã€ã³ã¹ã¿ã³ã·ã³ã°ãUBO管çïŒãå éšã§å®è£ ããŸãã
- å éšã¡ã«ããºã ã®çè§£ïŒãã¬ãŒã ã¯ãŒã¯ã䜿çšããå Žåã§ãããã®å éšãªãœãŒã¹ç®¡çãçè§£ããããšã¯æçã§ãããã®ç¥èã«ããããã¬ãŒã ã¯ãŒã¯ã®æ©èœããã广çã«äœ¿çšããæé©åãç¡å¹ã«ããå¯èœæ§ã®ãããã¿ãŒã³ãåé¿ããããã©ãŒãã³ã¹ã®åé¡ãããäžæã«ãããã°ã§ããŸããããšãã°ãThree.jsããããªã¢ã«ããšã«ãªããžã§ã¯ããã°ã«ãŒãåããæ¹æ³ãçè§£ãããšãæé©ãªã¬ã³ããªã³ã°ããã©ãŒãã³ã¹ã®ããã«ã·ãŒã³ã°ã©ããæ§é åããã®ã«åœ¹ç«ã¡ãŸãã
- ã«ã¹ã¿ãã€ãºãšæ¡åŒµæ§ïŒé«åºŠã«ç¹æ®åãããã¢ããªã±ãŒã·ã§ã³ã®å Žåã¯ãã«ã¹ã¿ã ã§åŸ®èª¿æŽãããæé©åãå®è£ ããããã«ããã¬ãŒã ã¯ãŒã¯ã®ã¬ã³ããªã³ã°ãã€ãã©ã€ã³ã®äžéšãæ¡åŒµãããããã€ãã¹ãããããå¿ èŠãããå ŽåããããŸãã
ä»åŸã®å±æïŒWebGPUãšãªãœãŒã¹ãã€ã³ãã£ã³ã°ã®å°æ¥
WebGLã¯åŒãç¶ã匷åã§åºããµããŒããããŠããAPIã§ãããæ¬¡äžä»£ã®Webã°ã©ãã£ãã¯ã¹ã§ããWebGPUã¯ãã§ã«ç®åã«è¿«ã£ãŠããŸããWebGPUã¯ãVulkanãMetalãããã³DirectX 12ã«å€§ããè§Šçºããããã¯ããã«æç€ºçã§ææ°ã®APIãæäŸããŸãã
- æç€ºçãªãã€ã³ãã£ã³ã°ã¢ãã«ïŒWebGPUã¯ãWebGLã®æé»çãªã¹ããŒããã·ã³ãããããã€ã³ãã°ã«ãŒãããããã€ãã©ã€ã³ããªã©ã®æŠå¿µã䜿çšãããããæç€ºçãªãã€ã³ãã£ã³ã°ã¢ãã«ã«ç§»è¡ããŸããããã«ãããéçºè ã¯ãªãœãŒã¹ã®å²ãåœãŠãšãã€ã³ãã£ã³ã°ããã现ããå¶åŸ¡ã§ããããã«ãªããå€ãã®å Žåãææ°ã®GPUã§ããåªããããã©ãŒãã³ã¹ãšããäºæž¬å¯èœãªåäœã«ã€ãªãããŸãã
- æŠå¿µã®ç¿»èš³ïŒç¶æ 倿Žã®æå°åããããåŠçãå¹ççãªããŒã¿ã¬ã€ã¢ãŠããã¹ããŒããªãªãœãŒã¹ç·šæãªã©ãWebGLã§åŠãã æé©åã®ååã®å€ãã¯ãå¥ã®APIã§è¡šçŸãããŠãããã®ã®ãWebGPUã§ãåŒãç¶ãéåžžã«éèŠã«ãªããŸããWebGLã®ãªãœãŒã¹ç®¡çã®èª²é¡ãçè§£ããããšã¯ãWebGPUãžã®ç§»è¡ãšåªããææãäžããããã®åŒ·åãªåºç€ãšãªããŸãã
çµè«ïŒæé«ã®ããã©ãŒãã³ã¹ãå®çŸããããã®WebGLãªãœãŒã¹ç®¡çã®ç¿åŸ
å¹ççãªWebGLã·ã§ãŒããŒãªãœãŒã¹ãã€ã³ãã£ã³ã°ã¯ç°¡åãªã¿ã¹ã¯ã§ã¯ãããŸãããããã®ç¿åŸã¯ã髿§èœã§å¿çæ§ãé«ããèŠèŠçã«é åçãªWebã¢ããªã±ãŒã·ã§ã³ãäœæããããã«äžå¯æ¬ ã§ããã€ã³ã¿ã©ã¯ãã£ããªããŒã¿èŠèŠåãæäŸããã·ã³ã¬ããŒã«ã®ã¹ã¿ãŒãã¢ããããã建ç¯ã®é©ç°ã玹ä»ãããã«ãªã³ã®ãã¶ã€ã³äŒç€ŸãŸã§ãæµåçã§é«å¿ å®åºŠã®ã°ã©ãã£ãã¯ã¹ã®éèŠã¯æ®éçã§ãããã®ã¬ã€ãã§æŠèª¬ãããŠããæŠç¥ãç±å¿ã«é©çšããããšã«ãããUBOãã€ã³ã¹ã¿ã³ã·ã³ã°ãªã©ã®WebGL2æ©èœãæ¡çšãããããåŠçããã¯ã¹ãã£ã¢ãã©ã¹ãéããŠãªãœãŒã¹ã现å¿ã®æ³šæãæã£ãŠç·šæããåžžã«ç¶æ ã®æå°åãåªå ããããšã«ãããå€§å¹ ãªããã©ãŒãã³ã¹åäžãå®çŸã§ããŸãã
æé©åã¯å埩çãªããã»ã¹ã§ããããšãå¿ããªãã§ãã ãããåºæ¬çãªç¥èããã£ãããšçè§£ããããšããå§ããæ¹åãæ®µéçã«å®è£ ããåžžã«å€æ§ãªããŒããŠã§ã¢ããã³ãã©ãŠã¶ç°å¢å šäœã§å³å¯ãªãããã¡ã€ãªã³ã°ã䜿çšããŠå€æŽãæ€èšŒããŸããç®æšã¯ãã¢ããªã±ãŒã·ã§ã³ãå®è¡ãããã ãã§ãªãããããæ¥äžæãããããã€ã¹ãå Žæã«é¢ä¿ãªããäžçäžã®ãŠãŒã¶ãŒã«åè¶ããèŠèŠäœéšãæäŸããããšã§ãããããã®ãã¯ããã¯ãæ¡çšããã°ãWebäžã®ãªã¢ã«ã¿ã€ã 3Dã§å¯èœãªããšã®éçãæŒãåºããæºåãæŽããŸãã